//
//  NetworkHelper.h
//  Kugou-OC
//
//  Created by BH on 16/5/30.
//  Copyright © 2016年 Sunny. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@class AFHTTPRequestOperation;

typedef NS_ENUM(NSUInteger,ResponseType) {
    kResponseTypeJSON = 1, //默认
    kResponseTypeXML = 2,
    kResponseTypeData = 3
};

typedef NS_ENUM(NSUInteger,RequestType) {
    kRequestTypeJSON, //默认
    kRequestTypePlainText
};

typedef AFHTTPRequestOperation RequestOperation;
typedef void(^SuccessBlock)(id response);
typedef void(^FailureBlock)(NSError *error);

@interface NetworkHelper : NSObject

+(instancetype)shareNetwork;

/**
 *  对外公开可获取当前所设置的网络接口基础url
 *
 *  @return 当前基础url
 */
-(NSString *)baseUrl;

/**
 *  用于指定网络请求接口的基础url，如：
 *  http://henishuo.com或者http://101.200.209.244
 *  通常在AppDelegate中启动时就设置一次就可以了。如果接口有来源
 *  于多个服务器，可以调用更新
 *
 *  @param baseUrl 网络接口的基础url
 */
-(void)updateBaseUrl:(NSString *)baseUrl;

/**
 *  开启或关闭接口打印信息
 *
 *  @param isDebug 开发期，最好打开，默认是NO
 */
-(void)enableInterfaceDebug:(BOOL)isDebug;

/**
 *  配置返回格式，默认为JSON。若为XML或者PLIST请在全局修改一下
 *
 *  @param responsetype 响应格式
 */
-(void)configResponseType:(ResponseType)responsetype;

/**
 *  配置请求格式，默认为JSON。如果要求传XML或者PLIST，请在全局配置一下
 *
 *  @param requesttype 请求格式
 */
-(void)configRequestType:(RequestType)requesttype;

/**
 *  配置公共的请求头，只调用一次即可，通常放在应用启动的时候配置就可以了
 *
 *  @param httpHeader 只需要将与服务器商定的固定参数设置即可
 */
-(void)configCommonHttpHeaders:(NSDictionary *)httpHeader;

/**
 *  开启或关闭是否自动将URL使用UTF8编码，用于处理链接中有中文时无法请求的问题
 *
 *  @param autoEncode YES or NO,默认为NO
 */
-(void)shouldAutoEncodeUrl:(BOOL)autoEncode;

/**
 *  带参数GET请求
 *
 *  @param url     请求地址
 *  @param view    添加指示器的view
 *  @param success 请求成功回调
 *  @param failure 请求失败回调
 */
-(void)getDataWithUrl:(NSString *)url view:(UIView *)view success:(SuccessBlock)success failure:(FailureBlock)failure;

/**
 *  无参GET请求
 *
 *  @param url     请求地址
 *  @param params  请求参数
 *  @param view    添加指示器的view
 *  @param success 请求成功回调
 *  @param failure 请求失败回调
 */
-(void)getDataWithUrl:(NSString *)url params:(NSDictionary *)params view:(UIView *)view success:(SuccessBlock)success failure:(FailureBlock)failure;

/**
 *  同步GET请求
 *
 *  @param url     请求地址
 *  @param params  请求参数
 *  @param view    添加指示器的view
 *  @param success 请求成功回调
 *  @param failure 请求失败回调
 */
-(void)syncGetDataWithUrl:(NSString *)url params:(NSDictionary *)params view:(UIView *)view success:(SuccessBlock)success failure:(FailureBlock)failure;

/**
 *  POST请求
 *
 *  @param url     请求地址
 *  @param params  请求参数
 *  @param view    添加指示器的view
 *  @param success 请求成功回调
 *  @param failure 请求失败回调
 */
-(void)postDataWithUrl:(NSString *)url params:(NSDictionary *)params view:(UIView *)view success:(SuccessBlock)success failure:(FailureBlock)failure;

/**
 *  同步POST请求
 *
 *  @param url     请求地址
 *  @param params  请求参数
 *  @param view    添加指示器的view
 *  @param success 请求成功回调
 *  @param failure 请求失败回调
 */
-(void)syncPostDataWithUrl:(NSString *)url params:(NSDictionary *)params view:(UIView *)view success:(SuccessBlock)success failure:(FailureBlock)failure;

/*
 *  下载进度
 *
 *  @param bytesRead                 已下载的大小
 *  @param totalBytesRead            文件总大小
 *  @param totalBytesExpectedToRead 还有多少需要下载
 */
typedef void (^DownloadProgress)(NSUInteger bytesRead,
                                    long long totalBytesRead,
                                    long long totalBytesExpectedToRead);

/*
 *  下载文件
 *
 *  @param url           下载URL
 *  @param saveToPath    下载到哪个路径下
 *  @param progressBlock 下载进度
 *  @param success       下载成功后的回调
 *  @param failure       下载失败后的回调
 */
- (void)downloadWithUrl:(NSString *)url
                              saveToPath:(NSString *)saveToPath
                                progress:(DownloadProgress)progressBlock
                                 success:(SuccessBlock)success
                                 failure:(FailureBlock)failure;

@end
